package com.yango.oss.service.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.CannedAccessControlList;
import com.yango.oss.service.FileService;
import com.yango.oss.utils.ReadPropertiesUtil;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.UUID;

/**
 * @author Li.Ding.yin
 * @create 2021年07月23日21:02-星期五
 * @role oss业务层接口实现类
 */
@Service
public class FileServiceImpl implements FileService {
    //图片上传，返回上传之后图片URL路径
    @Override
    public String upload(MultipartFile file) {
        //通过工具类获取配置文件配置
        String endpoint = ReadPropertiesUtil.ENDPOINT;
        String keyid = ReadPropertiesUtil.KEYID;
        String keysecret = ReadPropertiesUtil.KEYSECRET;
        String bucketname = ReadPropertiesUtil.BUCKETNAME;
        String url;//返回路径
        try {
            //创建OSSClient实例
            OSS ossClient = new OSSClientBuilder().build(endpoint, keyid, keysecret);
            //判断oss实例是否存在，如果不存在，创建，存在则获取
            if (!ossClient.doesBucketExist(bucketname)) {//bucket不存
                //创建bucket
                ossClient.createBucket(bucketname);
                //设置权限-公开读
                ossClient.setBucketAcl(bucketname, CannedAccessControlList.PublicRead);
            }
            //获取上传文件流
            InputStream inputStream = file.getInputStream();
            //获取当前日期
            String dataPath = new DateTime().toString("yyyy/MM/dd");
            //获取上传文件名
            String filename = file.getOriginalFilename();
            //使用UUID工具类生成随机字符串并将所有的 “-” 去掉
            String uuid = UUID.randomUUID().toString().replaceAll("-", "");
            //拼接文件名
            filename = uuid + filename;
            filename = dataPath + "/" + uuid + filename;
            //调用方法实现上传
            /**
             * 三个参数
             * 第一个:bucket名称
             * 第二个:上传到oss的文件路径和名称
             * 第三个:上传文件输入流
             */
            ossClient.putObject(bucketname, filename, inputStream);
            //关闭ossClient
            ossClient.shutdown();
            //返回上传后的文件路径，需手动拼接
            url = "https://" + bucketname + "." + endpoint + "/" + filename;
            return url;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
